/*
 * @Description: 日志处理 log4js for pm2
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-05-26 18:05:31
 * @LastEditTime: 2022-05-10 16:28:18
 */
import log4js from 'log4js'
const IsDev = process.env.NODE_ENV === "development"

// log4js配置案例：https://github.com/log4js-node/log4js-node/tree/master/examples

//日志等级列表，顺序越后等级越高
//等级大小写均可，all是输出全部，off是不输出
enum LEVELS {
    ALL = 'ALL',
    TRACE = 'TRACE',
    DEBUG = 'DEBUG',
    INFO = 'INFO',
    WARN = 'WARN',
    ERROR = 'ERROR',
    FATAL = 'FATAL',
    OFF = 'OFF'
}

//配置
log4js.configure({
    // 存哪里,指定日志的输出位置
    // 每个 appender 中包含一个 layout,layout 用于定义日志的输出格式,这里直接使用默认就可
    // console-输出到控制台，stdout-输出到彩色控制台，file-输出到文件，tcp-输出（发消息）到tcp服务器
    // tcp:{ type: 'tcp', host: 'log.server', port: 12701 }
    // 小项目一般存到文件就可，大一点的项目一般将日志存到数据库。这里就需要单独搞一个日志微服务了
    appenders: {
        // 输出到控制台
        std: {
            type: 'stdout',
            level: LEVELS.ALL, // 允许所有等级
        },
        // 默认输出到文件（所有日志）
        output: {
            type: 'file', // 输出到文件
            filename: 'logs/out.log',
            maxLogSize: 10485760, //文件最大容量10M
            backups: 3, //保留3个文件
            encoding: "utf-8"
        },
        //错误信息
        error: {
            type: 'logLevelFilter', // 单独配置等级，不受categories中配置的干扰
            level: LEVELS.ERROR, // 单独输出ERROR及FATAL等级别的日志
            appender: 'errorFile', // 输出到err文件
        },
        // 错误级别以上的日志输出到相应文件
        errorFile: {
            type: 'file', // 输出到文件
            filename: 'logs/err.log',
            maxLogSize: 10485760, //10M
            backups: 3,
            encoding: "utf-8"
        },
    },
    // 存储器，日志实例，实例化时可以传入如`log4js.getLogger('xxx')`
    // 每个实例中可以包含多个 appender
    categories: {
        // 默认，可直接实例化无需传参`log4js.getLogger()`
        // 生产模式，只输出到文件
        default: {
            appenders: ['output', 'error'],
            level: LEVELS.ALL,
        },
        // 输出到文件，同时打印到终端
        print: {
            appenders: ['std', 'output', 'error'],
            level: LEVELS.ALL,
        },
        // 只输出到终端，开发模式
        dev: {
            appenders: ['std'],
            level: LEVELS.ALL,
        },
    },
    // 允许使用pm2部署
    pm2: true,
})

const log = IsDev ? log4js.getLogger('dev') : log4js.getLogger()
const print = log4js.getLogger('print')

/* Example */
// Log.trace('追踪级别')
// Log.debug('调试级别')
// Print.info('信息级别')
// Log.warn('警告级别')
// Log.error('错误级别')
// Log.fatal('致命错误级别')

export default log

export {
    print, // 同时打印到终端及文件，一般用于测试
}